//
//  RevanBaseViewController.swift
//  weibo_swift
//
//  Created by 紫荆秋雪 on 16/11/29.
//  Copyright © 2016年 紫荆秋雪. All rights reserved.
//

import UIKit



//MARK: 1、系统生命周期
class RevanBaseViewController: UIViewController {
    // 1-0、定义变量
    /// 表格视图，如果用户没有登录，就不创建
    var tableView: UITableView?
    /// 刷新控件
    var refreshControl: UIRefreshControl?
    /// 刷新标记
    var isPullup = false
    /// 访客视图信息字典
    var visitorInfoDict: [String : String]?
    
    
    // 1-1、懒加载
    //1、自定义 导航条
    lazy var navigationBar = UINavigationBar(frame: CGRect(x: 0, y: 0, width: UIScreen.screenWith(), height: 64))
    //2、自定义 导航条目
    lazy var navItem = UINavigationItem()

    // 1-2、系统的生命周期
    override func viewDidLoad() {
        super.viewDidLoad()
        //设置UI
        setupBaseUI()
        // 加载数据
        RevanNetworkManager.shared.userLogon ? loadData() : ()
        
        // 监听通知
        RevanNotificationCenter.addObserver(self, selector: #selector(loginSuccess), name: NSNotification.Name(rawValue: RevanUserShouldLoginNotification), object: nil)
    }
    
    // 注销通知
    deinit {
        RevanNotificationCenter.removeObserver(self)
    }
    
    // 1-3、重写title的set方法
    override var title: String? {
        didSet {
            navItem.title = title
        }
    }
    
    // 1-4、加载数据
    @objc func loadData() {
        //结束刷新
        refreshControl?.endRefreshing()
    }
    
    /// 监听登录按钮
    @objc func loginButtonClick() {
        print("登陆按钮")
        // 发送通知
        RevanNotificationCenter.post(name: NSNotification.Name(rawValue: RevanUserShouldLoginNotification), object: nil)
    }
    // 1-6、注册按钮
    @objc func registerButtonClick() {
        print("注册按钮")
    }
    
}


//MARK: 2、设置导航栏
extension RevanBaseViewController {
    // 2-0、设置UI
    func setupBaseUI() {
        /// 1、设置导航栏
        setupNavigationBar()
        /// 2、设置tableView
        RevanNetworkManager.shared.userLogon ? setupTableView() : setupVisitorView()
    }
    // 2-1、设置背景颜色
    func setupNavigationBar() {
        //1、设置控制器背景颜色
        view.backgroundColor = UIColor.revanColorRGB()
        //2、把 自定义 导航条 添加到View 上
        view.addSubview(navigationBar)
        //3、navItem 设置给 bar
        navigationBar.items = [navItem]
        //4、设置navigationBar整体的渲染颜色
        navigationBar.barTintColor = UIColor.revancolor(withRed: 246.0, green: 246.0, blue: 246.0, alpha: 1.0)
        //5、设置 导航栏 title颜色
        navigationBar.titleTextAttributes = [NSForegroundColorAttributeName : UIColor.darkGray]
        //6、设置Item的文字颜色
        navigationBar.tintColor = UIColor.orange
    }
    
    // 2-2、设置UITableView
    private func setupTableView() {
        // 1、实例化tableView
        tableView = UITableView(frame: view.bounds, style: .plain)
        // 2、添加到父控件上
        view.insertSubview(tableView!, belowSubview: navigationBar)
        // 3、设置代理
        tableView?.dataSource = self
        tableView?.delegate = self
        // 4、取消自动缩进
        automaticallyAdjustsScrollViewInsets = false
        // 5、设置contentInset
        tableView?.contentInset = UIEdgeInsets(top: navigationBar.bounds.height,
            left: 0,
            bottom: tabBarController?.tabBar.bounds.height ?? 49,
            right: 0)
        // 5、设置tableView的竖直指示器的偏移量
        tableView?.scrollIndicatorInsets = tableView!.contentInset
        
        // 6、下拉刷新控件
        // 实例化下拉刷新控件
        refreshControl = UIRefreshControl()
        // 添加到tableView
        tableView?.addSubview(refreshControl!)
        // 监听下拉刷新控件
        refreshControl?.addTarget(self, action: #selector(loadData), for: .valueChanged)
    }
    
    // 2-3、访客视图
    private func setupVisitorView() {
        // 1、new visitorView
        let visitorView = RevanVisitorView(frame: view.bounds)
        // 2、set visitorView dict
        visitorView.visitorInfo = visitorInfoDict
        // inserteView 
        view.insertSubview(visitorView, belowSubview: navigationBar)
        // 3、loginButton addTarget
        visitorView.loginButton.addTarget(self, action: #selector(loginButtonClick), for: .touchUpInside)
        // registerButton addTarget
        visitorView.registerButton.addTarget(self, action: #selector(registerButtonClick), for: .touchUpInside)
        
        // 4、设置访客视图模式下的导航条
        navItem.leftBarButtonItem = UIBarButtonItem(title: "注册", style: .plain, target: self, action: #selector(registerButtonClick))
        navItem.rightBarButtonItem = UIBarButtonItem(title: "登录", style: .plain, target: self, action: #selector(loginButtonClick))
    }
}

//MARK: 3、设置UITableView代理实现
extension RevanBaseViewController: UITableViewDataSource, UITableViewDelegate {
    // 3-1、确定有多少组
    func numberOfSections(in tableView: UITableView) -> Int {
        return 0
    }
    // 3-2、确定每组有多少行
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 0
    }
    // 3-3、返回每组cell的内容
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
    
    // 3-4、上拉加载
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
        // 1、获取当前行
        let row = indexPath.row
        // 2、获取组数
        let section = tableView.numberOfSections - 1
        // 3、返回
        if row < 0 && section < 0 {
            return
        }
        // 3、最后一组的行数
        let count = tableView.numberOfRows(inSection: section)
        // 4、如果滚动到 最后一组、最后一行时，加载跟多
        if row == count - 1 && !isPullup {
            // 设置上拉标识
            isPullup = true
            //加载数据
            loadData()
        }
    }
}

// MARK: - 4、监听 通知
extension RevanBaseViewController {
    @objc func loginSuccess() {
        print("监听 -- 登录成功")
        // 设置导航栏 左右 的Item
        navItem.leftBarButtonItem = nil
        navItem.rightBarButtonItem = nil
        
        // 更新 UI -> 将访客视图替换成 表格视图
        // 需要重新设置 View
        // 在访问 view 的 getter时， 如果View == nil 会调用 loadView -> viewDidLoad
        view = nil
        
        // 因为view = nil时，会重新调用 viewDidLoad，会重新注册通知，所以要手动释放通知
        RevanNotificationCenter.removeObserver(self)
    }
}

